package com.tarena.luban.sentinel.datasource;

import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.net.URL;
import java.util.List;

/**
 * sentinel提供的接口
 * 实现并不是sentinel实现的(符合SPI思路)
 * 最终加载 告诉sentinel
 */
@Slf4j
public class LocalDataSourceInit implements InitFunc {
    //初始化加载规则文件的
    @Override
    public void init() throws Exception {
        log.info("本地读取flowRule文件开始");
        //1.读取文件,获取文件名称,类加载器的api
        ClassLoader classLoader = LocalDataSourceInit.class.getClassLoader();
        URL resource = classLoader.getResource("flowRules.json");
        String fileAllName=resource.getFile();
        //2.调用sentinel现成,将json格式数据文本转化为List<FlowRule>
        ReadableDataSource<String, List<FlowRule>> datasource=
            new FileRefreshableDataSource<List<FlowRule>>
                    (fileAllName, new Converter<String, List<FlowRule>>() {
                        /**
                         * @param json 从文件中读到的文本
                         * @return
                         */
                        @Override
                        public List<FlowRule> convert(String json) {
                            //调用JSON ali的json工具包
                            //将[] 格式json文本转化成list对象
                            return JSON.parseArray(json,FlowRule.class);
                        }
                    });
        //如果有第二个文件 读取文件全名称 新建第二个datasource
        //3.FlowRuleManager将数据源注册
        FlowRuleManager.register2Property(datasource.getProperty());
    }
}
